package com.northpool.operator.utils;

import cn.hutool.core.annotation.AnnotationUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.lang.Console;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSONObject;
import com.northpool.operator.IOperatorHandler;
import com.northpool.operator.annotation.OutputParams;

import java.io.File;
import java.util.Arrays;

public abstract class StpOperatorHelper implements IOperatorHandler {

    protected StpOperatorHelper() {
    }

    protected void result(String key, Object value) {
        this.result(key, value, true);
    }

    /**
     * 结果参数输出
     * @param key 参数名
     * @param value 参数值
     */
    protected void result(String key, Object value, Boolean printToLog) {
        // 判断当前类有没有这个输出的参数
        OutputParams outParams = AnnotationUtil.getAnnotation(this.getClass(), OutputParams.class);
        boolean hasOutputParam = Arrays.stream(outParams.value()).anyMatch(item -> item.ref().equals(key));
        if(!hasOutputParam) {
            throw new RuntimeException("当前类没有定义输出参数：" + key);
        }

        // 写入resultFile
        String resultFilePath = System.getenv().get("STP_JOB_RESULT_FILE");
        if (StrUtil.isNotBlank(resultFilePath)) {
            File file = FileUtil.file(resultFilePath);
            try {
                JSONObject jsonObject = new JSONObject();
                if (file.exists()) {
                    String content = FileUtil.readUtf8String(file);
                    jsonObject = JSONObject.parseObject(content);
                }
                jsonObject.put(key, StrUtil.utf8Str(value));
                FileUtil.writeUtf8String(jsonObject.toJSONString(), file);
            } catch (Exception ex) {
                error("结果文件写入失败：" + ex.getMessage());
                failedExit();
            }
        }

        if (printToLog) {
            log(String.format("<%1$s>%2$s</%1$s>", key, value));
        }
    }

    /**
     * 异常退出
     */
    public void failedExit() {
        System.exit(10);
    }

    public void successExit() {
        System.exit(0);
    }

    public void waiting(int hour) {
        try {
            Thread.sleep((long) hour * 60 * 1000);
        } catch (InterruptedException var3) {
            this.log("等待异常。");
        }
    }

    /**
     * 异常日志
     * @param msg 错误信息
     */
    public void error(Object msg) {
        Console.error(msg);
    }

    /**
     * 异常日志
     * @param template 日志模板
     * @param args 日志参数
     */
    public void error(String template, Object... args) {
        Console.error(template, args);
    }


    /**
     * 普通日志输出
     * @param template 日志模板
     * @param args 日志参数
     */
    public void log(String template, Object... args) {
        Console.log(template, args);
    }

    /**
     * 普通日志输出
     * @param msg 日志信息
     */
    public void log(Object msg) {
        Console.log(msg);
    }

    public File workerDir() {
        String dir = System.getProperty("user.dir");
        return FileUtil.file(dir);
    }
}
